package powerup;

import nivel.Nivel;
import logica.EntidadConLogica;
import logica.Logica;
import movimiento.MovimientoIA;

/**
 * Clase abstracta que factoriza los atributos de un PowerUp Dinamico (con
 * movimiento)
 * 
 * @author Agustin Orge (LU.85538)
 * @author Victoria Martinez de la Cruz (LU.87620)
 */

public abstract class Dinamico extends PowerUp implements EntidadConLogica {

	/** Atributos de instancia **/
	protected Logica control;
	protected MovimientoIA movimiento;
	protected char rumbo;

	/**
	 * Constructor de la clase Dinamico
	 * 
	 * @param n
	 *            nivel con el cual el powerup esta en relacion
	 */
	protected Dinamico(Nivel n) {
		super(n);
		rumbo = 'd';
	}

	// consultas

	/**
	 * Rumbo del powerup
	 * 
	 * @return rumbo
	 */
	public char getRumbo() {
		return rumbo;
	}

	/**
	 * PowerUp activado
	 * 
	 * @return true si el powerup esta activado, false en caso contrario
	 */
	public boolean estaActivado() {
		return activado;
	}

	// comandos

	/**
	 * Metodo abstracto que simula la situacion en la que Mario agarra el
	 * powerup
	 */
	@Override
	public abstract void agarrar();

	/**
	 * Movimiento a derecha. Si el powerup choca con un obstaculo, cambia de
	 * rumbo
	 */
	public void moverDerecha() {
		if (control.moverDerecha(this)) {
			movimiento.moverDerecha(casilleroActual, label);
			rumbo = 'd';
		} else {
			rumbo = 'i';
		}

	}

	/**
	 * Movimiento a izquierda. Si el powerup choca con un obstaculo, cambia de
	 * rumbo
	 */
	public void moverIzquierda() {
		if (control.moverIzquierda(this)) {
			movimiento.moverIzquierda(casilleroActual, label);
			rumbo = 'i';
		} else {
			rumbo = 'd';
		}

	}

	/**
	 * Caer de una plataforma o en un abismo
	 */
	public void caer() {
		if (control.caer(this)) {
			movimiento.caer(casilleroActual, label);
		}

	}

	// metodos propios de la interfaz EntidadConLogica
	// los powerups no los utilizan

	public void saltar() {
	}

	public boolean estaCayendo() {
		return false;
	}

	public void setCayendo(boolean b) {
	}
}
